import java.io.*;
import java.util.zip.*;
import javax.swing.tree.*;

/** Modification de fichier
  * pour la traduction de jeux video
  *
  * @author     Nemesis (nemesis_tt@yahoo.fr)
  * @version    24/05/04
  */
 
public abstract class Modif extends CheckNode
{
    /** Fichier de listing des modifs */
    private static String nom_infos = "Infos.lst";
    
    /** Dossier de base */
    protected static String base_dir = "Patch";
    
    /** Fichier contenant les données du patch */
    protected static ZipPatch patch;
    
    /** Log d'erreurs et d'avancement */
    private static Log log = null;
    
    /** Pause */
    protected static boolean stop = false;
    protected static boolean pause = false;
    
    /** Constructeur de modification */
    public Modif()
    {
        super();
    }
    
    /** Lecture de l'ensemble des modifications à appliquer */
    public static Modif chargement(ZipPatch patch_) throws IOException {
        patch = patch_;
        
        // Ouverture de la liste des modifications
        BufferedReader f = new BufferedReader(
            new InputStreamReader(patch.get(nom_infos)));
        if (f==null) {
            // En théorie traitement des patchs old style
            throw (new IOException());
        }
        return charge_rec(f);
    }

    /** Lecture récursive du "code" et création de l'arbre
     *  Renvoi null lorsque on finit un bloc ou le fichier */
    public static Modif charge_rec(BufferedReader f) throws IOException {
        String ligne = f.readLine();
        // Analyse à deux balles
        if (ligne==null) throw (new IOException());
        
        // Formattage de la ligne
        ligne = ligne.trim();
        String[] parts = ligne.split(" : ");
        parts[0].toLowerCase();
        
        // Traitement de tous les cas
        Modif modif = null;
        // Cas d'un dump de fichier
        if (parts[0].equals("dump")) {
            modif = new Modif_Dump(Integer.parseInt(parts[1]));
        // Cas d'une réinsertion de fichier
        } else if (parts[0].equals("rein")) {
            modif = new Modif_Rein(Integer.parseInt(parts[1]));
        // Cas d'une décompression CPT
        } else if (parts[0].equals("cptD")) {
            modif = new Modif_CptD(parts[1]);
        // Cas d'une compression CPT
        } else if (parts[0].equals("cptC")) {
            modif = new Modif_CptC(parts[1]);
        // Cas d'une décompression DRP
        } else if (parts[0].equals("drpD")) {
            modif = new Modif_DrpD(parts[1]);
        // Cas d'une compression DRP
        } else if (parts[0].equals("drpC")) {
            modif = new Modif_DrpC(parts[1]);
        // Cas d'une extraction de fichier du zip
        } else if (parts[0].equals("extr")) {
            modif = new Modif_Extr(parts[1]);
        // Cas d'une application d'ips
        } else if (parts[0].equals("ips")) {
            modif = new Modif_Ips(parts[1]);
        // Cas d'un ensemble de commandes
        } else if (parts[0].equals("group")) {
            Modif fils;
            modif = new Modif_Liste(parts[1]);
            while ((fils = charge_rec(f))!=null) {
                modif.add(fils);
            }
        // Cas d'une fin de liste
        } else if (parts[0].equals("end")) {
            modif = null;
        // Commande inconnue
        } else
            throw (new IOException());
        
        return modif;
    }
    
    public void setPause(boolean p) {
        pause = p;
    }
    
    public abstract String toString();
    
    public abstract void appliquer();
}
